package lsl.sparsearray;

/**
 * 稀疏数组
 *
 * @author Zed
 * @date 2021/12/19 16:31
 */
public class SparseArray {
    public static void main(String[] args) {
        //0表示没有棋子 1表示白子 2表示黑子

        //创建14行 16列的棋盘
        int[][] cheeseArr = new int[14][16];
        //第5行第6列为白子(1);第6行第7列为黑子(2) 第7行第6列为白子(1); 第7行第8列为黑子(2);第10行第13列为白子(1);
        cheeseArr[4][5] = 1;
        cheeseArr[5][6] = 2;
        cheeseArr[6][5] = 1;
        cheeseArr[6][7] = 2;
        cheeseArr[9][12] = 1;
        for (int i = 0; i < cheeseArr.length; i++) {
            for (int j = 0; j < cheeseArr[0].length; j++) {
                System.out.printf("%d\t", cheeseArr[i][j]);
            }
            System.out.println();
        }


        int sum = 0;
        //1.获取二维数组有效值个数
        for (int i = 0; i < cheeseArr.length; i++) {
            for (int j = 0; j < cheeseArr[0].length; j++) {
                //判断二维数组数字是否为0
                if (cheeseArr[i][j] != 0) {
                    sum++;
                }
            }
        }
        //2.将二维数组转换为稀疏数组
        //2.1稀疏数组第一行用来记录二维数据的信息;稀疏数组的行数为二维数组有效值个数+1
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = cheeseArr.length;
        sparseArr[0][1] = cheeseArr[0].length;
        sparseArr[0][2] = sum;

        //3.将二维数组存在的值保存进稀疏数组
        //计数器 记录二维数组的有效值个数
        int count = 0;
        for (int i = 0; i < cheeseArr.length; i++) {
            for (int j = 0; j < cheeseArr[0].length; j++) {
                //判断二维数组数字是否为0
                if (cheeseArr[i][j] != 0) {
                    sparseArr[count + 1][0] = i;
                    sparseArr[count + 1][1] = j;
                    sparseArr[count + 1][2] = cheeseArr[i][j];
                    count++;
                }
            }
        }
        System.out.println("======================打印稀疏数组");
        //打印稀疏数组
        for (int i = 0; i < sparseArr.length; i++) {
            for (int j = 0; j < sparseArr[0].length; j++) {
                System.out.printf("%d\t", sparseArr[i][j]);
            }
            System.out.println();
        }


        //4.将稀疏数组转换为二维数组
        int[][] cheeseArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];

        System.out.println("======================打印二维数组");
        for (int i = 1; i < sparseArr.length; i++) {
            cheeseArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
        }

        for (int i = 0; i < cheeseArr2.length; i++) {
            for (int j = 0; j < cheeseArr2[0].length; j++) {
                System.out.printf("%d\t", cheeseArr2[i][j]);
            }
            System.out.println();
        }
    }
}
